package com.oauth2.server.dblogin.controller;

import com.oauth2.server.dblogin.utils.HttpUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
@RequestMapping("/connect")
public class Oauth2Controller {

    // 提前在微信端注册的appid 和redirect_uri
    public static final String THE_APP_ID = "ThisIsWxOpenAppId";
    public static final String THE_APP_SECRET ="ThisIsWxOpenAppSecret";
    public static final String THE_APP_REDIRECTURI = "http://127.0.0.1:8080/api/wechat/user/callback";
    // 临时授权code
    public static final String TEMPORARY_CODE = "123456";
    // access_token
    public static final String ACCESS_TOKEN = "ACCESS_TOKEN";

    public static final String OPENID = "OPENID";



    /**
     * 跳转到登录页面
     * @param appId 应用的appid
     * @param redirectUrl 确认登录后需要回调的地址，临时授权code要传给这个接口
     * @param resopnseType
     * @param scope
     * @param state 用户传来的，到时候再传回去
     * @return
     */
    @GetMapping("qrconnect")
    public ModelAndView qrconnect(@RequestParam(value = "appid")String appId, @RequestParam(value = "redirect_uri") String redirectUrl,
                            @RequestParam(value = "response_type") String resopnseType, @RequestParam(value = "scope") String scope,
                            @RequestParam(value = "state")String state, ModelAndView modelAndView){
        System.err.println(appId);
        System.err.println(redirectUrl);
        System.err.println(resopnseType);
        System.err.println(scope);
        System.err.println(state);

        // 验证 appid 和 redirect_uri，若验证通过跳转到登录界面,否则跳转到错误页面，提示错误信息
        if(appId.equals(THE_APP_ID) && redirectUrl.equals(THE_APP_REDIRECTURI)){
            modelAndView.setViewName("login");
            modelAndView.getModelMap().addAttribute("state",state);
            return modelAndView;
        }else {
            modelAndView.setViewName("error");
            return modelAndView;
        }
    }

    /**
     * 对请求的应用进行回调
     * @param isLogin 是否授权登录
     * @param stae 传带的参数
     */
    @PostMapping("/wechatcallback")
    public String wechatLoginCallBack(@RequestParam(value = "islogin") String isLogin, @RequestParam(value = "state") String stae){

        // 验证是否允许登录,1允许否则不允许，
        if(isLogin.equals("1")){
            // 允许登录，则回调并且返回临时授权code，并且把开始的state再传送回去
            String callback_url = THE_APP_REDIRECTURI + "?code=" + TEMPORARY_CODE + "&state="+stae;
            // 重定向进行回调
            return "redirect:"+callback_url;
        }
        return null;
    }

    /**
     * 给第三方应用发送token
     * @param appId
     * @param secret
     * @param code 临时授权码
     * @return
     */
    @GetMapping("access_token")
    @ResponseBody
    public Map<String, Object> accessToken(@RequestParam(value = "appid")String appId, @RequestParam(value = "secret") String secret, @RequestParam( value = "code") String code){

        Map<String, Object> map = new HashMap<String,Object>();
        if(appId.equals(THE_APP_ID) && secret.equals(THE_APP_SECRET) && code.equals(TEMPORARY_CODE)){
            map.put("access_token",ACCESS_TOKEN); // 接口调用凭证
            map.put("expires_in",7200); // access_token接口调用凭证超时时间，单位（秒）
            map.put("refresh_token","REFRESH_TOKEN"); // 用户刷新access_token
            map.put("openid",OPENID); // 授权用户唯一标识
            map.put("scope","SCOPE"); // 用户授权的作用域，使用逗号（,）分隔
            map.put("unionid","o6_bmasdasdsad6_2sgVt7hMZOPfL"); // 当且仅当该网站应用已获得该用户的userinfo授权时，才会出现该字段。

        }
        return map;

    }

    /**
     * 获取用户信息
     * @param accessToken
     * @param openId
     * @return
     */
    @GetMapping("userinfo")
    @ResponseBody
    public Map<String, Object> userInfo(@RequestParam(value = "access_token")String accessToken, @RequestParam(value = "openid")String openId){

        Map<String, Object> map = new HashMap<String,Object>();
        if(accessToken.equals(ACCESS_TOKEN) && openId.equals(OPENID)){
            map.put("openid",OPENID); // 普通用户的标识，对当前开发者帐号唯一
            map.put("nickname","KING-LPW"); // 普通用户昵称
            map.put("sex",1); // 普通用户性别，1为男性，2为女性
            map.put("province","山西"); // 普通用户个人资料填写的省份
            map.put("city","太原"); // 普通用户个人资料填写的城市
            map.put("country","中国"); // 国家，如中国为CN
            map.put("headimgurl",""); // 用户头像，最后一个数值代表正方形头像大小（有0、46、64、96、132数值可选，0代表640*640正方形头像），用户没有头像时该项为空

            List<String> list = new ArrayList<String>();
            list.add("PRIVILEGE1");
            list.add("PRIVILEGE2");

            map.put("privilege",list);
            map.put("unionid","o6_bmasdasdsad6_2sgVt7hMZOPfL"); // 用户统一标识。针对一个微信开放平台帐号下的应用，同一用户的unionid是唯一的。
        }
        return map;
    }

}
